package simplemaven2.vt;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import ru.chezclif.lern.conread.Preconditions;
import simplemaven2.vt.data.Config;
import simplemaven2.vt.utils.BeanUtils;
import simplemaven2.vt.utils.Settings;
import org.richfaces.event.FileUploadEvent;
import org.richfaces.model.UploadedFile;
import java.io.*;

/**
 * Бин для отдельной страницы загрузки конфигурационного файла
 *
 * @author Vit
 */
public class UploadPageRightBean implements Serializable {
    /**
     * Переменная для передаваямого от клиента файла
     */
    private UploadedFile uploadedFile = null;
    /**
     * Показывает факт успешной передачи файла на сервер
     */
    private Boolean uploaded = false;
    /**
     * Переменная показывающая абсолютный путь до загруженного файла
     */
    private String filePath = "";
    /**
     * Переменная показывающая название файла до загрузки на сервер
     */
    private String oldFileName = "";
    /**
     * Название типа конфига: xml, properties, ini
     */
    private String protocol = "";
    /**
     * Стандартный логгер
     */
    private static final Logger logger = Logger.getLogger(UploadPageRightBean.class);

    /**
     * Удаляет файл и сбрасывает все перменные
     */
    public void clearFile() {
        File fileForDel = new File(filePath);
        if (fileForDel != null) {
            fileForDel.delete();
        }
        this.filePath = "";
        this.oldFileName = "";
        this.uploaded = false;
        this.uploadedFile = null;
        this.protocol = "";
    }

    /**
     * Удаляет файл, сбрасывает переменные и переводит правую сторону в пустое состояние
     */
    public void clearAndGoEmptyPage() {
        clearFile();
        goEmptyPage();
    }

    /**
     * Перенаправляет на страницу с загруженными конфигами, заполняет промежуточный конфиг и очищает настройки
     */
    public void goPresentPage() {
        PresentationRightBean presentationrightbean = (PresentationRightBean) BeanUtils.getBean("presentationrightbean");
        Preconditions.notNull(presentationrightbean);
        presentationrightbean.setDeltaConfig(new Config(oldFileName, Config.stringPseudoProtConvert(protocol, filePath)));
        presentationrightbean.setFileName(presentationrightbean.getDeltaConfig().getConfigName());
        clearFile();
        LegalBean legalBean = (LegalBean) BeanUtils.getBean("legalbean");
        Preconditions.notNull(legalBean);
        legalBean.setNowUsedPage(2);
        logger.info("Going to the presentation page");
    }

    /**
     * Перенаправляет на пустую страницу
     */
    public void goEmptyPage() {
        LegalBean legalBean = (LegalBean) BeanUtils.getBean("legalbean");
        Preconditions.notNull(legalBean);
        legalBean.setNowUsedPage(0);
    }

    //Геттеры и сеттеры
    public Boolean getUploaded() {
        return uploaded;
    }

    public void setUploaded(Boolean uploaded) {
        Preconditions.notNull(uploaded);
        this.uploaded = uploaded;
    }

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        Preconditions.notNull(uploadedFile);
        this.uploadedFile = uploadedFile;
    }

    public String getFilePath() {
        return filePath;
    }

    public void setFilePath(String filePath) {
        Preconditions.notNull(filePath);
        this.filePath = filePath;
    }

    public String getOldFileName() {
        return oldFileName;
    }

    public void setOldFileName(String oldFileName) {
        Preconditions.notNull(oldFileName);
        this.oldFileName = oldFileName;
    }

    public String getProtocol() {
        return protocol;
    }

    public void setProtocol(String protocol) {
        Preconditions.notNull(protocol);
        this.protocol = protocol;
    }

    /**
     * Загрузка файла на сервер
     *
     * @param event элемен, содержащий файл
     */
    public void fileUploadListener(FileUploadEvent event) throws Exception {
        UploadedFile uploadedFile = event.getUploadedFile();
        String prefix = FilenameUtils.getBaseName(uploadedFile.getName());
        String suffix = FilenameUtils.getExtension(uploadedFile.getName());
        oldFileName = prefix + "." + suffix + " ";
        File file = null;
        OutputStream output = null;
        try {
            // Create file with unique name in upload folder and write to it.
            file = File.createTempFile(prefix + "_", "." + suffix, new File(Settings.getPathToUpload()));
            output = new FileOutputStream(file);
            IOUtils.copy(uploadedFile.getInputStream(), output);
            filePath = file.getAbsolutePath();
            fileIsUpload();
        } catch (IOException e) {
            // Cleanup.
            if (file != null) file.delete();
            // Always log stacktraces (with a real logger).
            e.printStackTrace();
            logger.error("Error with create file on server - ", e);
        } finally {
            IOUtils.closeQuietly(output);
        }
    }

    public void fileIsUpload() {
        this.uploaded = true;
    }

}
